﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using System.Data;
using System.IO;
using System.Configuration;
using System.Transactions;
using System.Data.Linq;
using System.ComponentModel;
using UtilityExtensions;


namespace BOL.RendicionVentas
{
    public class GetDepositoVentaList
    {
        int _count;
        public int Count(int idProyecto,int idCuenta, string    clienteStr, string numDocumentoStr,DateTime fechaInicio,DateTime fechaFin ,
                         int startRowIndex,
                         int maximumRows,
                         string sortExpression)
        {
            return _count;
        }


        public IQueryable<DepositioVentaInfo> ApplySelect_ListInfo()
        {
            var q = from a in DbUtil.Db.LiquidacionVentas
                    select new DepositioVentaInfo
                    {
                        idinternal = a.idinternal,
                        banco = a.CuentaBanco.Banco.descripcion,
                        cuenta = a.CuentaBanco.descripcion,
                        moneda = a.CuentaBanco.Moneda.descripcion,
                        fecha = a.fechaDeposito,
                        numDeposito =a.numero,
                        total = a.total,
                        idDeposito = a.idArchivo,
                        cliente = a.RendicionVenta.RendicionVentaItems.First().OrdenVentaFormato.OrdenVentaItem.OrdenVenta.Cliente.descripcion,
                        localizacion = a.RendicionVenta.RendicionVentaItems.First().OrdenVentaFormato.OrdenVentaItem.UI.UILocalizacion.descripcion,
                        ui = a.RendicionVenta.RendicionVentaItems.First().OrdenVentaFormato.OrdenVentaItem.UI.descripcion,
                        etapa = a.RendicionVenta.RendicionVentaItems.First().OrdenVentaFormato.OrdenVentaItem.UI.Etapa.descripcion ,
                        idProyecto=a.RendicionVenta.idProyecto,
                        idCuenta=a.idCuenta
                    };
            return q;
        }


        private IQueryable<DepositioVentaInfo> ApplySort(IQueryable<DepositioVentaInfo> q,
                                                        string sortExpression)
        {
            switch (sortExpression)
            {
                case "cuenta":
                    q = q.OrderBy(b => b.cuenta);
                    break;

                case "cuenta DESC":
                    q = q.OrderByDescending(b => b.cuenta);
                    break;

                case "moneda":
                    q = q.OrderBy(b => b.moneda);
                    break;

                case "moneda DESC":
                    q = q.OrderByDescending(b => b.moneda);
                    break;
                case "numDeposito":
                    q = q.OrderBy(b => b.numDeposito);
                    break;

                case "numDeposito DESC":
                    q = q.OrderByDescending(b => b.numDeposito);
                    break;



                case "banco":
                    q = q.OrderBy(b => b.banco);
                    break;
                
                case "banco DESC":
                    q = q.OrderByDescending(b => b.banco);
                    break;

                case "fecha":
                    q = q.OrderBy(b => b.fecha);
                    break;
                case "fecha DESC":
                    q = q.OrderByDescending(b => b.fecha);
                    break;

                case "total":
                    q = q.OrderBy(b => b.total);
                    break;
                case "total DESC":
                    q = q.OrderByDescending(b => b.total);
                    break;

                      
                default:
                    q = q.OrderByDescending(b => b.fecha).OrderByDescending(p => p.cuenta);
                    break;
            }
            return q;
        }



        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public IEnumerable<DepositioVentaInfo> Execute(int idProyecto,
                                                            int idCuenta,
                                                            string clienteStr, 
                                                            string numDocumentoStr, 
                                                            DateTime fechaInicio, 
                                                            DateTime fechaFin,
                                                            int startRowIndex,
                                                            int maximumRows,
                                                            string sortExpression)
        {

            if (!clienteStr.HasValue())
                clienteStr = string.Empty;
            if (!numDocumentoStr.HasValue())
                numDocumentoStr = string.Empty;

            //var r= from a in DbUtil.Db.RendicionVentaItems
            //       where a.RendicionVenta.idProyecto==idProyecto
            //       & (a.OrdenVentaFormato.OrdenVentaItem.OrdenVenta.Cliente.descripcion.Contains(clienteStr)
            //          | a.OrdenVentaFormato.OrdenVentaItem.OrdenVenta.Cliente1.descripcion.Contains(clienteStr))
            //        select a.idRendicionVenta;


            
            var q = ApplySelect_ListInfo();


            q = q.Where(a => a.fecha>=fechaInicio 
                        & a.fecha<=fechaFin
                        & a.numDeposito.Contains(numDocumentoStr)
                        & a.idProyecto==idProyecto
                        & a.cliente.Contains(clienteStr)
                        & (idCuenta==0?a.idCuenta!=idCuenta:a.idCuenta==idCuenta)
                        );


          
            
            _count = q.Count();
            
            q = ApplySort(q, sortExpression);
            return q.Skip(startRowIndex).Take(maximumRows);
        }

    }
}
